menushell: don't activate a menu entry when opening a big menu
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Thu, 27 Jun 2013 17:01:14 +0000 (19:01 +0200)
committerEmilio Pozuelo Monfort <pochu27@gmail.com>
Thu, 27 Jun 2013 18:20:53 +0000 (20:20 +0200)
If a menu is opened and it doesn't fit entirely below or above
the menu bar, gtk+ will place it on top. The button release will
then activate the popup item that happens to appear under the
cursor. Avoid this by ignoring release events if they originated
in the parent menu bar and the duration of the press was too short.

https://bugzilla.gnome.org/show_bug.cgi?id=703069

gtk/gtkmenushell.c

index 5bc426bdaa60db6f17cbf0bb4c7d0c5507c63e46..01366b7a6b6937e78b73567caa995350c323aca3 100644 (file)
@@ -809,6 +809,18 @@ gtk_menu_shell_button_release (GtkWidget      *widget,
   GtkMenuShell *menu_shell = GTK_MENU_SHELL (widget);
   GtkMenuShellPrivate *priv = menu_shell->priv;
 
+  if (priv->parent_menu_shell &&
+      (event->time - GTK_MENU_SHELL (priv->parent_menu_shell)->priv->activate_time) < MENU_SHELL_TIMEOUT)
+    {
+      /* The button-press originated in the parent menu bar and we are
+       * a pop-up menu. It was a quick press-and-release so we don't want
+       * to activate an item but we leave the popup in place instead.
+       * https://bugzilla.gnome.org/show_bug.cgi?id=703069
+       */
+      GTK_MENU_SHELL (priv->parent_menu_shell)->priv->activate_time = 0;
+      return TRUE;
+    }
+
   if (priv->active)
     {
       GtkWidget *menu_item;